package com.lzl.redisratelimit.util;

import java.util.Arrays;
import java.util.List;

public class LimitKey {

    /**
     * 这里在拼接key的时候，对id使用了大括号{}进行了包裹，这是因为lua脚本执行成功的前提条件是所用使用到的redis健值必须在一个hash槽中，使用大括号对key进行包裹后，
     * redis在对key进行hash时，指挥hash大括号内部的字符，这样就可以保证lua脚本中的使用的key-value在同一个槽内。这样就确保了cluster模式下正常执行redis-lua脚本，
     * 但是需要注意的是，这里大括号内包裹的内容不能是不变的，如果是不变的话，会有大量的key-value被分配到同一个槽里，导致hash倾斜，key-value分布不均匀。
     */
    public static List<String> getLimitKey(String scene, String key) {
        String prefix = "request_rate_limiter." + scene + ".{" + key;
        String tokenKey = prefix + "}.tokens";
        String timestampKey = prefix + "}.timestamp";
        return Arrays.asList(tokenKey, timestampKey);
    }
}
